module.exports = MockIncomingMessage;

var Transform = require('stream').Transform,
	util = require('util');

function MockIncomingMessage(options) {
	var self = this;
	options = options || {};

	Transform.call(this);
	this._writableState.objectMode = true;
	this._readableState.objectMode = false;

	// Copy unreserved options
	var reservedOptions = [
		'method',
		'url',
		'headers',
		'rawHeaders'
	];

	Object.keys(options).forEach(function(key) {
		if (reservedOptions.indexOf(key) === -1)
			self[key] = options[key];
	});

	this.method = options.method || 'GET';
	this.url = options.url || '';

	// Set header names
	this.headers = {};
	this.rawHeaders = [];
	if (options.headers)
		Object.keys(options.headers).forEach(function(key) {
			var val = options.headers[key];

			if(val !== undefined) {
				if (typeof val !== 'string') {
					val += '';
				}

				self.headers[key.toLowerCase()] = val;
				self.rawHeaders.push(key);
				self.rawHeaders.push(val);
			}
		});

	// Auto-end when no body
	if (this.method === 'GET' || this.method === 'HEAD' || this.method === 'DELETE')
		this.end();
}

util.inherits(MockIncomingMessage, Transform);

MockIncomingMessage.prototype._transform = function(chunk, encoding, next) {
	if (this._failError)
		return this.emit('error', this._failError);

	if (typeof chunk !== 'string' && !Buffer.isBuffer(chunk))
		chunk = JSON.stringify(chunk);

	this.push(chunk);

	next();
};

// Causes the request to emit an error when the body is read.
MockIncomingMessage.prototype._fail = function(error) {
	this._failError = error;
};
